package com.itheima.health.controller;

import com.itheima.interfaces.MemberService;
import com.itheima.resources.MessageConstant;
import com.itheima.resources.RedisConstant;
import com.itheima.resources.RedisMessageConstant;
import com.itheima.resources.aliyunmessage.SMSUtils;
import com.itheima.resources.code.ValidateCodeUtils;
import com.itheima.resources.entity.Result;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.UUIDEditor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * 微信端的后台 业务处理
 * 增
 */
@RequestMapping("member")
@RestController
public class MemberController {

    @Reference
    private MemberService memberService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @param telephone
     * @return 不同的用户保存验证码要唯一，后续登录校验验证码 要获取指定用户的验证码  保存的key : 标识+用户手机号
     */
    @RequestMapping("sendCodeToYou.do")
    public Result sendCodeToYou(@RequestParam("telephone") String telephone) {

        try {
            //创建随机验证码
            String utils = ValidateCodeUtils.generateValidateCode(4);
            System.out.println("---登录验证码: " + utils);
            // 阿里云随机验证码
            // SMSUtils.sendMessageTuYou(telephone,utils);

            //   redis 保存 验证码 90s  单位是 毫秒     set(key,value,long expired.)
            //redisTemplate.opsForValue().set(RedisMessageConstant.SENDTYPE_LOGIN+telephone,randomcode,90000);  //  或者使用下面代码
            redisTemplate.opsForValue().set(RedisMessageConstant.SENDTYPE_LOGIN + telephone, utils, 90, TimeUnit.SECONDS);
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(true, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
    }

    @RequestMapping("login.do")
    public Result login(@RequestParam("code") String code, @RequestParam("telephone") String telephone) {
        try {
            if (code != null) {
                //   获取 redis 保存 验证码   比对
                String redisCode = (String) redisTemplate.opsForValue().get(RedisMessageConstant.SENDTYPE_LOGIN + telephone);
                if (redisCode == null) {
                    //防止过时
                    return new Result(false, MessageConstant.SEND_VALIDATECODE_TIMEOUT);
                } else {
                    //Redis 存在的验证码和用户输入的验证码进行比对
                    if (redisCode.equals(code)) {
                        //输入正确,判断是否新用户
                        //   用户 新用户 录入系统
                        memberService.addNewMember(telephone);
                        return new Result(true, MessageConstant.LOGIN_SUCCESS);
                    } else {
                        //输入错误
                        return new Result(false, MessageConstant.VALIDATECODE_ERROR);
                    }
                }
            } else {
                return new Result(false, "非法验证码");
            }
        } catch (Exception e) {
            e.printStackTrace();
            //返回错误类型
            return new Result(false, e.getMessage());
        }
    }

    /**
     * @param telephone
     * @return 不同的用户保存验证码要唯一，后续登录校验验证码 要获取指定用户的验证码  保存的key : 标识+用户手机号
     */
    @RequestMapping("orderCodeToYou.do")
    public Result orderCodeToYou(@RequestParam("telephone") String telephone) {
        try {
            //创建随机验证码
            String utils = ValidateCodeUtils.generateValidateCode(4);
            System.out.println("---预约套餐验证码: " + utils);
            // 阿里云随机验证码
            // SMSUtils.sendMessageTuYou(telephone,utils);
            //   redis 保存 验证码 90s  单位是 毫秒     set(key,value,long expired.)
            //redisTemplate.opsForValue().set(RedisMessageConstant.SENDTYPE_LOGIN+telephone,randomcode,90000);  //  或者使用下面代码
            redisTemplate.opsForValue().set(RedisMessageConstant.SENDTYPE_ORDER + telephone, utils, 90, TimeUnit.SECONDS);
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(true, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
    }
}
